class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        // 分析：通过规律
        /*
            e.g:     0   1   2
                0    1   2   3              7   4   1
                1    4   5   6     --->     8   5   2
                2    7   8   9              9   6   3

                1:(0, 0) ---> (0, 2)
                2:(0, 1) ---> (1, 2)
                3:(0, 2) ---> (2, 2)
                4:(1, 0) ---> (0, 1)
                5:(1, 1) ---> (1, 1)
                6:(1, 2) ---> (2, 1)

            注意:row表示当前行，col表示当前列
            规律:matrix[row][col] ---> matrix[col][n - 1 - row]
            两步: 
                1. 水平翻转
                    matrix[row][col] ---> matrix[n - 1 - row][col]
                    这一步做完还差一点需要将 n - 1 - row 与 col 对调，所以就需要对角线翻转可以帮我们实现
                2. 对角线翻转
                    matrix[row][col] ---> matrix[col][row]
                    对应上面也就是matrix[n - 1 - row][col] ---> matrix[col][n - 1 - row]
        */
        /*
            1   2   3           7   8   9           7   4   1
            4   5   6   --->    4   5   6   --->    8   5   2
            7   8   9           1   2   3           9   6   3
        */

        int n = matrix.size();
        // 水平翻转
        for(int i = 0; i < n / 2; i++)
            for(int j = 0; j < n; j++)
                swap(matrix[i][j], matrix[n - i - 1][j]);

        // 对角线翻转
        for(int i = 1; i < n; i++)
            for(int j = 0; j < i; j++)
                swap(matrix[i][j], matrix[j][i]);

        // 规律是tmp[j][n - i - 1] = matrix[i][j];
        // 但是需要重新开辟一个二维矩阵
        // int n = matrix.size();
        // vector<vector<int>> tmp(n, vector<int>(n, 0));
        // for(int i = 0; i < n; i++)
        //     for(int j = 0; j < n; j++)
        //         tmp[j][n - i - 1] = matrix[i][j];
        // matrix = tmp;
    }
};